<template>
  <a-table
    rowKey="id"
    size="middle"
    bordered
    :loading="loading"
    :columns="columns"
    :dataSource="processedDataSource"
    :pagination="false"
  >

    <template slot="htmlSlot" slot-scope="text">
      <div v-html="text"></div>
    </template>

    <template slot="imgSlot" slot-scope="text,record">
      <div style="font-size: 12px;font-style: italic;">
        <span v-if="!text">无图片</span>
        <img v-else :src="getImgView(text)" :preview="record.id" alt="" style="max-width:80px;height:25px;"/>
      </div>
    </template>

    <template slot="fileSlot" slot-scope="text">
      <span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>
      <a-button
        v-else
        ghost
        type="primary"
        icon="download"
        size="small"
        @click="downloadFile(text)"
      >
        <span>下载</span>
      </a-button>
    </template>

  </a-table>
</template>

<script>
import { getAction } from '@api/manage'
import { JeecgListMixin } from '@/mixins/JeecgListMixin'

export default {
  name: 'CwJbszqkzbSubTable',
  mixins: [JeecgListMixin],
  props: {
    record: {
      type: Object,
      default: null,
    }
  },
  data() {
    return {
      description: '基本收支情况总表内嵌列表',
      disableMixinCreated: true,
      loading: false,
      dataSource: [],
      // 1. 工资福利支出合计项目（原有）
      salaryWelfareProjects: [
        '基本工资',
        '津贴补贴',
        '奖金',
        '伙食补助费',
        '绩效工资',
        '机关事业单位基本养老保险缴费',
        '职业年金缴费',
        '职工基本医疗保险缴费',
        '其他社会保障缴费',
        '住房公积金',
        '医疗费',
        '其他工资福利支出'
      ],
      // 2. 商品和服务支出合计项目（原有）
      goodsServiceProjects: [
        '办公费',
        '印刷费',
        '手续费',
        '水费',
        '电费',
        '邮电费',
        '取暖费',
        '物业管理费',
        '差旅费',
        '因公出国境费用',
        '维修护费',
        '租赁费',
        '会议费',
        '培训费',
        '公务接待费',
        '专用材料费',
        '被装购置费',
        '专用燃料费',
        '劳务费',
        '委托业务费',
        '工会经费',
        '公务用车运行维护费',
        '其他交通费用',
        '税金及附加费用',
        '其他商品和服务支出'
      ],
      // 3. 对个人和家庭的补助合计项目（原有）
      personalFamilyProjects: [
        '离休费',
        '退休费',
        '退职役费',
        '抚恤金',
        '其中在职人员',
        '离退休人员',
        '生活补助',
        '救济费',
        '医疗费补助',
        '助学金',
        '奖励金',
        '个人农业生产补贴',
        '代缴社会保险费',
        '其他对个人和家庭的补助'
      ],
      // 4. 新增：资本性支出合计项目（16个，剔除空项）
      capitalExpenditureProjects: [
        '房屋建筑物购建',
        '办公设备购置',
        '专用设备购置',
        '基础设施建设',
        '大型修缮',
        '信息网络及软件购置更新',
        '物资储备',
        '土地补偿',
        '安置补助',
        '地上附着物和青苗补偿',
        '拆迁补偿',
        '公务用车购置',
        '其他交通工具购置',
        '文物和陈列品购置',
        '无形资产购置',
        '其他资本性支出'
      ],
      // 5. 收入类合计项目（需求指定8个项目）
      incomeProjects: [
        '上年结转',
        '财政拨款收入',
        '事业收入',
        '其中社保返还',
        '成果转化',
        '其他',
        '其他收入离退休费差额',
        '使用非财政拨款结余',
        '其他收入'
      ],
      columns: [
        {
          title: '支出类型',
          align: 'center',
          dataIndex: 'disbursementType'
        },
        {
          title: '项目',
          align: 'center',
          dataIndex: 'project',
        },
        {
          title: '预算数合计',
          align: 'center',
          dataIndex: 'ysshj',
          customRender: (text) => this.formatNumber(text) // 格式化金额
        },
        {
          title: '其中：财政',
          align: 'center',
          dataIndex: 'financial',
          customRender: (text) => this.formatNumber(text) // 格式化金额
        },
        {
          title: '其中：非财政',
          align: 'center',
          dataIndex: 'nonFinancials',
          customRender: (text) => this.formatNumber(text) // 格式化金额
        },
        {
          title: '测算依据',
          align: 'center',
          dataIndex: 'calculationBasis',
          customCell: () => ({
            style: {
              'white-space': 'normal',
              'word-break': 'break-all',
              'min-width': '150px',
              'max-width': '200px',
              'vertical-align': 'middle'
            }
          })
        },
        {
          title: '填报说明',
          align: 'center',
          dataIndex: 'cwTbsm',
          customCell: () => ({
            style: {
              'white-space': 'normal',
              'word-break': 'break-all',
              'min-width': '150px',
              'max-width': '200px',
              'vertical-align': 'middle'
            }
          })
        },
        {
          title: '年度',
          align: 'center',
          dataIndex: 'year_dictText'
        },
      ],
      url: {
        listByMainId: '/cw/cwJbszqkzbZhu/queryCwJbszqkzbByMainId',
      },
    }
  },
  computed: {
    // 处理后的数据源：包含四条合计行
    processedDataSource() {
      if (!this.dataSource || this.dataSource.length === 0) return []

      // 深拷贝原始数据，避免污染
      const newData = JSON.parse(JSON.stringify(this.dataSource))
      const incomeTotal = this.calcIncomeTotal()
      // 计算四条合计数据
      const salaryWelfareTotal = this.calcSalaryWelfareTotal() // 工资福利支出合计
      const goodsServiceTotal = this.calcGoodsServiceTotal() // 商品和服务支出合计
      const personalFamilyTotal = this.calcPersonalFamilyTotal() // 对个人和家庭的补助合计
      const capitalExpenditureTotal = this.calcCapitalExpenditureTotal() // 新增：资本性支出合计
      // 1. 收入类合计：插入到“上年结转”上一条
      const lastYearCarryOverIndex = newData.findIndex(item => item.project === '上年结转')
      if (lastYearCarryOverIndex !== -1) {
        newData.splice(lastYearCarryOverIndex, 0, incomeTotal)
      } else {
        newData.unshift(incomeTotal) // 未找到时插入到最前面
      }
      // 插入顺序：按分类逻辑依次插入，互不干扰
      // 1. 资本性支出合计（房屋建筑物购建上一条）
      const buildingPurchaseIndex = newData.findIndex(item => item.project === '房屋建筑物购建')
      if (buildingPurchaseIndex !== -1) {
        newData.splice(buildingPurchaseIndex, 0, capitalExpenditureTotal)
      } else {
        newData.unshift(capitalExpenditureTotal)
      }

      // 2. 对个人和家庭的补助合计（离休费上一条）
      const retirementFeeIndex = newData.findIndex(item => item.project === '离休费')
      if (retirementFeeIndex !== -1) {
        newData.splice(retirementFeeIndex, 0, personalFamilyTotal)
      } else {
        newData.unshift(personalFamilyTotal)
      }

      // 3. 商品和服务支出合计（办公费上一条）
      const officeFeeIndex = newData.findIndex(item => item.project === '办公费')
      if (officeFeeIndex !== -1) {
        newData.splice(officeFeeIndex, 0, goodsServiceTotal)
      } else {
        newData.unshift(goodsServiceTotal)
      }

      // 4. 工资福利支出合计（基本工资上一条）
      const basicSalaryIndex = newData.findIndex(item => item.project === '基本工资')
      if (basicSalaryIndex !== -1) {
        newData.splice(basicSalaryIndex, 0, salaryWelfareTotal)
      } else {
        newData.unshift(salaryWelfareTotal)
      }

      return newData
    }
  },
  watch: {
    record: {
      immediate: true,
      handler() {
        if (this.record != null) {
          this.loadData(this.record)
        }
      }
    }
  },
  methods: {
    loadData(record) {
      this.loading = true
      this.dataSource = []
      getAction(this.url.listByMainId, {
        id: record.id
      }).then((res) => {
        if (res.success) {
          this.dataSource = res.result.records || []
        }
      }).finally(() => {
        this.loading = false
      })
    },
    /**
     * 新增：计算收入类项目合计
     */
    calcIncomeTotal() {
      let ysshjTotal = 0 // 预算数合计
      let financialTotal = 0 // 财政
      let nonFinancialsTotal = 0 // 非财政

      this.dataSource.forEach(item => {
        if (this.incomeProjects.includes(item.project)) {
          ysshjTotal += Number(item.ysshj) || 0
          financialTotal += Number(item.financial) || 0
          nonFinancialsTotal += Number(item.nonFinancials) || 0
        }
      })

      return {
        id: 'income_total_' + new Date().getTime(), // 唯一ID避免冲突
        disbursementType: '小计',
        project: '收入类项目合计', // 合计行名称
        ysshj: ysshjTotal.toFixed(2),
        financial: financialTotal.toFixed(2),
        nonFinancials: nonFinancialsTotal.toFixed(2),
        calculationBasis: '以下收入类项目合计',
        cwTbsm: '',
        year_dictText: this.dataSource.length > 0 ? this.dataSource[0].year_dictText : ''
      }
    },
    /**
     * 原有：计算工资福利支出合计
     */
    calcSalaryWelfareTotal() {
      let ysshjTotal = 0 // 预算数合计
      let financialTotal = 0 // 财政
      let nonFinancialsTotal = 0 // 非财政

      this.dataSource.forEach(item => {
        if (this.salaryWelfareProjects.includes(item.project)) {
          ysshjTotal += Number(item.ysshj) || 0
          financialTotal += Number(item.financial) || 0
          nonFinancialsTotal += Number(item.nonFinancials) || 0
        }
      })

      return {
        id: 'salary_welfare_total_' + new Date().getTime(),
        disbursementType: '小计',
        project: '工资福利支出合计',
        ysshj: ysshjTotal.toFixed(2),
        financial: financialTotal.toFixed(2),
        nonFinancials: nonFinancialsTotal.toFixed(2),
        calculationBasis: '以下工资福利类项目合计',
        cwTbsm: '',
        year_dictText: this.dataSource.length > 0 ? this.dataSource[0].year_dictText : ''
      }
    },

    /**
     * 原有：计算商品和服务支出合计
     */
    calcGoodsServiceTotal() {
      let ysshjTotal = 0 // 预算数合计
      let financialTotal = 0 // 财政
      let nonFinancialsTotal = 0 // 非财政

      this.dataSource.forEach(item => {
        if (this.goodsServiceProjects.includes(item.project)) {
          ysshjTotal += Number(item.ysshj) || 0
          financialTotal += Number(item.financial) || 0
          nonFinancialsTotal += Number(item.nonFinancials) || 0
        }
      })

      return {
        id: 'goods_service_total_' + new Date().getTime(),
        disbursementType: '小计',
        project: '商品和服务支出合计',
        ysshj: ysshjTotal.toFixed(2),
        financial: financialTotal.toFixed(2),
        nonFinancials: nonFinancialsTotal.toFixed(2),
        calculationBasis: '以下商品和服务类项目合计',
        cwTbsm: '',
        year_dictText: this.dataSource.length > 0 ? this.dataSource[0].year_dictText : ''
      }
    },

    /**
     * 原有：计算对个人和家庭的补助合计
     */
    calcPersonalFamilyTotal() {
      let ysshjTotal = 0 // 预算数合计
      let financialTotal = 0 // 财政
      let nonFinancialsTotal = 0 // 非财政

      this.dataSource.forEach(item => {
        if (this.personalFamilyProjects.includes(item.project)) {
          ysshjTotal += Number(item.ysshj) || 0
          financialTotal += Number(item.financial) || 0
          nonFinancialsTotal += Number(item.nonFinancials) || 0
        }
      })

      return {
        id: 'personal_family_total_' + new Date().getTime(),
        disbursementType: '小计',
        project: '对个人和家庭的补助合计',
        ysshj: ysshjTotal.toFixed(2),
        financial: financialTotal.toFixed(2),
        nonFinancials: nonFinancialsTotal.toFixed(2),
        calculationBasis: '以下对个人和家庭的补助类项目合计',
        cwTbsm: '',
        year_dictText: this.dataSource.length > 0 ? this.dataSource[0].year_dictText : ''
      }
    },

    /**
     * 新增：计算资本性支出合计
     */
    calcCapitalExpenditureTotal() {
      let ysshjTotal = 0 // 预算数合计
      let financialTotal = 0 // 财政
      let nonFinancialsTotal = 0 // 非财政

      this.dataSource.forEach(item => {
        // 统计16个资本性支出类项目
        if (this.capitalExpenditureProjects.includes(item.project)) {
          ysshjTotal += Number(item.ysshj) || 0
          financialTotal += Number(item.financial) || 0
          nonFinancialsTotal += Number(item.nonFinancials) || 0
        }
      })

      return {
        id: 'capital_expenditure_total_' + new Date().getTime(), // 唯一ID，避免冲突
        disbursementType: '小计', // 支出类型与项目对应
        project: '资本性支出合计', // 合计行项目名称
        ysshj: ysshjTotal.toFixed(2), // 保留2位小数
        financial: financialTotal.toFixed(2),
        nonFinancials: nonFinancialsTotal.toFixed(2),
        calculationBasis: '以下资本性支出类项目合计', // 说明合计范围
        cwTbsm: '', // 填报说明留空
        // 兼容语法：继承年度信息
        year_dictText: this.dataSource.length > 0 ? this.dataSource[0].year_dictText : ''
      }
    },

    /**
     * 数字格式化（保留2位小数，兼容空值和字符串）
     */
    formatNumber(text) {
      const num = Number(text)
      return isNaN(num) ? '0.00' : num.toFixed(2)
    }
  },
}
</script>

<style scoped>
/* 1. 工资福利支出合计行样式（蓝色系） */
::v-deep .ant-table-tbody tr:has(td:contains('工资福利支出合计')) {
  background-color: #f0f8fb !important;
}
::v-deep .ant-table-tbody tr:has(td:contains('工资福利支出合计')) td {
  font-weight: 600 !important;
  color: #2563eb !important;
  border-top: 1px solid #4299e1 !important;
  border-bottom: 1px solid #4299e1 !important;
}

/* 2. 商品和服务支出合计行样式（绿色系） */
::v-deep .ant-table-tbody tr:has(td:contains('商品和服务支出合计')) {
  background-color: #f0fdf4 !important;
}
::v-deep .ant-table-tbody tr:has(td:contains('商品和服务支出合计')) td {
  font-weight: 600 !important;
  color: #059669 !important;
  border-top: 1px solid #10b981 !important;
  border-bottom: 1px solid #10b981 !important;
}

/* 3. 对个人和家庭的补助合计行样式（橙色系） */
::v-deep .ant-table-tbody tr:has(td:contains('对个人和家庭的补助合计')) {
  background-color: #fff7ed !important;
}
::v-deep .ant-table-tbody tr:has(td:contains('对个人和家庭的补助合计')) td {
  font-weight: 600 !important;
  color: #c2410c !important;
  border-top: 1px solid #f97316 !important;
  border-bottom: 1px solid #f97316 !important;
}

/* 4. 新增：资本性支出合计行样式（紫色系，区分前三条） */
::v-deep .ant-table-tbody tr:has(td:contains('资本性支出合计')) {
  background-color: #f5f3ff !important;
}
::v-deep .ant-table-tbody tr:has(td:contains('资本性支出合计')) td {
  font-weight: 600 !important;
  color: #6d28d9 !important;
  border-top: 1px solid #8b5cf6 !important;
  border-bottom: 1px solid #8b5cf6 !important;
}

/* 表格基础样式优化 */
::v-deep .ant-table-wrapper {
  overflow-x: auto !important;
}
::v-deep .ant-table-tbody td {
  vertical-align: middle !important;
}
</style>